package com.wjw.java.thread.locks;

/**
 * 死锁:多个线程都占用了对方的锁资源,但不肯相让,导致双方都一直拿着对方的锁,从而形成死锁
 * 案例：妈妈让小明写完作业,才能玩游戏
 *      小明要玩了游戏,才写作业
 *      双方僵持形成死锁
 *
 */
public class Dead_Lock {
    public static void main(String[] args) {
        DeadLock d1 = new DeadLock();
        d1.setName("妈妈");
        d1.setFlag(true);
        DeadLock d2 = new DeadLock();
        d2.setName("小明");
        d2.setFlag(false);

        d1.start();
        d2.start();
    }
}

class DeadLock extends Thread{
    //这里使用static静态的,及数据共享的,属于DeadLock类
    static Object play = new Object();//玩游戏
    static Object homework = new Object();//写作业

    private boolean flag;

    public boolean isFlag() {
        return this.flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    @Override
    public void run() {
        /**
         * 如果flag = true;
         * 线程A会先拿到homework的锁,然后尝试拿到play的锁
         * 如果没有拿到play的锁,线程A就会阻塞
         *
         * 如果flag = false;
         * 线程B会先拿到play的锁,然后尝试拿到homework的锁
         * 如果没有拿到homework的锁,线程B就会阻塞
         */
        if(flag){
            synchronized (homework){
                System.out.println(Thread.currentThread().getName()+":先写作业...");
                synchronized (play){
                    System.out.println(Thread.currentThread().getName()+":才能玩游戏...");
                }
            }
        }else{
            synchronized (play){
                System.out.println(Thread.currentThread().getName()+":先玩游戏...");
                synchronized (homework){
                    System.out.println(Thread.currentThread().getName()+":才能写作业 ");
                }
            }
        }
    }
}